//
//  CZEmoticonTextView.swift
//  WeiBo
//
//  Created by Apple on 16/9/11.
//  Copyright © 2016年 KY. All rights reserved.
//

import UIKit


extension CZComposeTextView {
    //  根据表情富文本获取表情字符串
    var emoticonString: String {
        var result = ""
        //  在指定范围内获取富文本的属性
        self.attributedText.enumerateAttributes(in: NSMakeRange(0, self.attributedText.length), options: []) { (infoDic, infoRange, _) in
            //  有NSAttachment 表示是图片富文本，获取对应的表情描述
            if let attachment = infoDic["NSAttachment"] as? CZTextAttachment {
                //  获取图片描述
                let emoticon = attachment.emoticon!
                result += emoticon.chs!
            } else {
                //  获取富文本对应的字符串
                let subStr = self.attributedText.attributedSubstring(from: infoRange).string
                result += subStr
            }
            
            
            
        }
        return result
    }

    //  通过表情模型插入富文本或者emoji表情
    func insertEmoticon(emoticon: CZEmoticon) -> Void {
        
        if emoticon.type == "0" {
            //  图片转成富文本
            
            //  记录上次的富文本
            let lastAttributedStr = NSMutableAttributedString(attributedString: self.attributedText)
            
            //  1. 创建image对象(通过图片路径创建对象)
            let image = UIImage(named: emoticon.path!)
            //  2. 通过image对象创建文本附件
            let attachment = CZTextAttachment()
            attachment.image = image
            //  设置模型
            attachment.emoticon = emoticon
            //  设置大小
            let fontHeight = self.font!.lineHeight
            attachment.bounds = CGRect(x: 0, y: -3, width: fontHeight, height: fontHeight)
            //  3. 通过文本附件创建富文本
            let attributedStr = NSAttributedString(attachment: attachment)
            
            //  获取选中的范围
            var selectedRange = self.selectedRange
            
            //  替换选中的范围
            lastAttributedStr.replaceCharacters(in: selectedRange, with: attributedStr)
            
            //  追加点击的富文本
            //lastAttributedStr.append(attributedStr)
            
            //  设置富文本的字体大小
            lastAttributedStr.addAttribute(NSFontAttributeName, value: self.font!, range: NSMakeRange(0, lastAttributedStr.length))
            //  4. 设置富文本
            self.attributedText = lastAttributedStr
            
            //  点击一个表情让其的选中开始位置往后加1
            selectedRange.location += 1; selectedRange.length = 0
            
            //  设置选中的范围
            self.selectedRange = selectedRange
            
            //  自己发送文字改边的通知和文字改变的代理方法
            //  插入富文本的时候不会调用文字不会改变
            NotificationCenter.default.post(name: NSNotification.Name.UITextViewTextDidChange, object: nil)
            //  文字的代理方法
            //  ? 再此判断代理方法是否在代理对象里面实现了，如果实现了那么执行后面的代码， 否则就返回nil不执行
            self.delegate?.textViewDidChange?(self)
            
            
        } else {
            //  插入文字
            let emoji = (emoticon.code! as NSString).emoji()
            self.insertText(emoji!)
        }
        
        
    }

}
